;; https://projecteuler.net/problem=26

;; Reciprocal cycles
;; Problem 26

;; A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

;;     1/2	=   0.5
;;     1/3	=   0.(3)
;;     1/4	=   0.25
;;     1/5	=   0.2
;;     1/6	=   0.1(6)
;;     1/7	=   0.(142857)
;;     1/8	=   0.125
;;     1/9	=   0.(1)
;;     1/10	=   0.1

;; Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.

;; Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.


(import
 (except (rnrs base) let-values map)
 (only (guile)
       lambda* λ)
 (ice-9 match)
 (contract)
 (prefix (lib math) math:)
 (lib print-utils))


(define-with-contract find-longest-repeating-decimals
  (require (integer? limit)
           (positive? limit)
           (> limit 1))
  (ensure (positive? <?>)
          (integer? <?>))
  (λ (limit)
    (let iter ([max-denom 1] [max-length 0] [denom 1])
      (let ([current-length
             (math:rational-repeating-decimals-length (/ 1 denom))])
        (cond
         [(>= denom limit)
          max-denom]
         [(> current-length max-length)
          (iter denom current-length (+ denom 1))]
         [else
          (iter max-denom max-length (+ denom 1))])))))


(simple-format
 (current-output-port)
 "denominator with longest recurring cycle in decimals: ~a\n"
 (find-longest-repeating-decimals 1000))
